IC解密单片机LCR电桥程序
- // 项目:IC解密LCD1602 四线驱动程序
- // 设计要点:
- // IC解密LCD1602 的运行速度慢,而单片机运行的速度快,因此容易因为速度不
- // 匹配造成调试失败。因此,调试之前应准确测试lcd_delay() 延时函数
- // 准确的延时量,如果不能满足注释中的要求,则应调整循次数。每步操
- // 作所需的延时量,按照数据手册指标指行,同时留下足够的时间余量。
- // 硬件连接:
- // 至少需要9条线,电源线2条,7条信号线。信号线详见程序中的接口定义。
- // 清注意对LCD1602对比度的调节,否则无显示。
- //==========================================================================
- sbit lcd_RS = P0^6; //数据命令控制位,0命令1数据
- sbit lcd_RW = P0^5; //读写位,0写1读
- sbit lcd_EN = P0^4; //使能位,下降沿触发
- sbit lcd_D4 = P0^3; //数据端口D4
- sbit lcd_D5 = P0^2; //数据端口D5
- sbit lcd_D6 = P0^1; //数据端口D6
- sbit lcd_D7 = P0^0; //数据端口D7
- //==========================================================================
- code char path[32]={
- 0x00,0x00,0x0e,0x11,0x11,0x0a,0x1b,0x00,
- 0x00,0x11,0x11,0x13,0x1d,0x10,0x10,0x10,
- 0x0e,0x11,0x1f,0x11,0x11,0x0e,0x00,0x00,
- 0x1C,0x10,0x1B,0x12,0x1B,0x01,0x07,0x00
- };//自定义符号
- char binLian=0,ATA=0,ATB=1;
- char OX[8]={0,0,0,0,0,0,8,0};
- int DDS3=1, c3 = 0; //交替显示变量
- char digW=4; //数字显示位数宏
- code uchar abc[][5]={
- " err"," 40"," 120"," 360"," 1080"," 1K"," 3K"," 9K"," 27K"," 10K",
- " 30K"," 90K"," 270K"," 100K"," 300K"," 900K"," 2.7M"," 13"," 4.5"," 1.5"
- };
- void lcd_delay(int n){ //LCD专用延时函数
- //32MHz钟频下,约循环3000次延迟1毫秒
- int i,j;
- if(n<0) { for(i=0;i< 30;i++); return; } //10us
- if(n== 0) { for(i=0;i<150;i++); return; } //50us
- for(;n;n--){ for(j=0;j<3000;j++); } //n毫秒
- }
- //==========================================================================
- void lcd_B(char f, uchar c, char t){ //控制四线式接口LCD的7个脚
- //f=0写命令字, f=1写RAM数据, f=2读地址(或读忙), f=3读RAM数据
- lcd_EN = 0;
- lcd_RS = f%2;
- lcd_RW = f/2%2;
- //移入高四位
- lcd_D4 = c & 16;
- lcd_D5 = c & 32;
- lcd_D6 = c & 64;
- lcd_D7 = c & 128;
- lcd_EN = 1; lcd_delay(-1); lcd_EN = 0; //使能脉冲
- if(f==4) { lcd_delay(t); return; }
- //移入低四位
- lcd_D4 = c & 1;
- lcd_D5 = c & 2;
- lcd_D6 = c & 4;
- lcd_D7 = c & 8;
- lcd_EN = 1; lcd_delay(-1); lcd_EN = 0; //使能脉冲
- lcd_delay(t); //不同的命令,响应时间不同,清零命令需要2ms
- }
- //==========================================================================
- void lcd_init(){ //LCD1602 初始化
- //启动四线模式须势行9个步骤,初始化所须耗时较长,约65ms,时限不可减
- lcd_delay(20); //启动lcd之前须延时大于15ms,直到VDD大于4.5V
- lcd_B(4, 0x30, 9); //置8线模式,须延时大于4.1ms
- lcd_B(4, 0x30, 5); //置8线模式,须延时大于100us
- lcd_B(4, 0x30, 5); //置8线模式,手册中未指定延时
- lcd_B(4, 0x20, 5); //进入四线模式
- lcd_B(0, 0x28, 5); //四线模式双行显示
- lcd_B(0, 0x0C, 5); //打开显示器
- lcd_B(0, 0x80, 5); //RAM指针定位
- lcd_B(0, 0x01, 5); //启动清屏命初始化LCD
- }
- //==========================================================================
- //=========================几个功能常用函数=================================
- void lcd_cls() { lcd_B(0, 0x01+0, 2); } //清屏
- void lcd_cur0() { lcd_B(0, 0x0C+0, 0); } //隐藏光标
- void lcd_goto1(uchar x){if(ATB) lcd_B(0, 0x80+x, 0); else lcd_B(0, 0x94+x, 0);} //设置DDRAM地址,第1行x位
- void lcd_goto2(uchar x){if(ATB) lcd_B(0, 0xC0+x, 0); else lcd_B(0, 0xD4+x, 0);} //设置DDRAM地址,第2行x位
- void lcd_goto3(uchar x){if(ATB) lcd_B(0, 0x94+x, 0); else lcd_B(0, 0x80+x, 0);} //设置DDRAM地址,第3行x位
- void lcd_goto4(uchar x){if(ATB) lcd_B(0, 0xD4+x, 0); else lcd_B(0, 0xC0+x, 0);} //设置DDRAM地址,第4行x位
- void lcd_putc(uchar d) { lcd_B(1, 0x00+d, 0); } //字符输出
- void lcd_puts(uchar *s){ for(; *s; s++) lcd_B(1,*s,0); } //字串输出
- //==============字符显示函数====================
- void lcd_putp(float a,float b,char bo,char n, float qmin){ //带单位显示复数,n是单位下限,qmin是最小位权值(用于限定有效数字)
- code uchar dwB[] = {'p','n','u','m',' ','k','M','G'}; //单位表
- char i,j, c=0, h=digW-1, fh[2]={' ','+'};
- long d,q,qm,Q=1; //最高位权
- float f,g=1;
- if(a<0) fh[0] = '-', a = -a;
- if(b<0) fh[1] = '-', b = -b;
- if(a>b) f = a; else f = b;
- for(i=1;i<digW;i++) Q *= 10;
- for(i=0;i<3;i++){ if(f*g >= 1000) g/=1000, c++; } //以3位为单位移动小数点,右移
- for(i=0;i<n;i++){ if(f*g < 1) g*=1000, c--; } //以3位为单位移动小数点,左移
- if ((n==1)&&(c==-1)){
- for(i=1;i<2 && f*g<Q;i++) g*=10,h--; //继续移动小数点,使之满字
- }else if ((n==2)&&(c==-2)){
- for(i=1;i<3 && f*g<Q;i++) g*=10,h--; //继续移动小数点,使之满字
- }else if ((n==4)&&(c==-4)){
- for(i=1;i<2 && f*g<Q;i++) g*=10,h--; //继续移动小数点,使之满字
- }else{
- for(i=1;i<digW && f*g<Q;i++) g*=10,h--; //继续移动小数点,使之满字
- }
- qm = g*qmin;
- for(i=0;i<2;i++){
- if(i) d = b*g; //取出实部
- else d = a*g; //取出虚部
- if(qm) d+=qm/2, d-=d%qm;//去除小于qmin的尾数
- q = Q;
- lcd_putc(fh[i]); //显示符号
- for(j=0; j<digW; j++){ //数字输出
- lcd_putc(d/q+48); //数字
- if(j==h) lcd_putc('.');//小数点
- d %= q, q /= 10;
- }
- if(!bo) break; //不显示虚部
- }
- //lcd_putc(dwB[c+4]); //单位
- if(dwB[c+4]=='u') { lcd_putc(9);} else {
- if(n==1){
- if(dwB[c+4]==' ') { lcd_putc(8); OX[6]=32; } else { lcd_putc(dwB[c+4]); OX[6]=8; } //自动单位
- }
- else { lcd_putc(dwB[c+4]); OX[6]=8; }
- } //符号
- }
- void lcd_putf(float a, char n, float qmin) //带单位显示浮点数,n是单位下限
- { lcd_putp(a,0,0,n,qmin); }
- void lcd_int(int a,char w){ //定宽显示正整数
- char i=0, s[5] = {' ',' ',' ',' ',' '};
- if(a<0) { a=-a; lcd_puts("-"); }
- else lcd_puts(" ");
- do{
- s[i++] = a%10+48;
- a /= 10;
- }while(a);
- for(;w;w--) lcd_putc(s[w-1]);
- }
上一篇:IC解密单片机自动浇花器程序

芯片解密