lcd1602随机显示乘法口诀的仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <REGX52.H>
- #include <INTRINS.H>
- unsigned int x,y,z;
- unsigned int sj_x_cnt = 0,sj_y_cnt = 0;//随机
- unsigned int sd_x_cnt = 0,sd_y_cnt = 0;//顺到序
- unsigned char cheng[46][2] =
- {
- {0,0},
- {1,1},
- {1,2},{2,2},
- {1,3},{2,3},{3,3},
- {1,4},{2,4},{3,4},{4,4},
- {1,5},{2,5},{3,5},{4,5},{5,5},
- {1,6},{2,6},{3,6},{4,6},{5,6},{6,6},
- {1,7},{2,7},{3,7},{4,7},{5,7},{6,7},{7,7},
- {1,8},{2,8},{3,8},{4,8},{5,8},{6,8},{7,8},{8,8},
- {1,9},{2,9},{3,9},{4,9},{5,9},{6,9},{7,9},{8,9},{9,9},
- };
- void delay1ms(unsigned char xms)
- {
- unsigned char i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /***************液晶显示模块*****************/
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit E=P2^2;
- sbit key=P1^4;
- sbit key2=P1^5;
- sbit key3=P1^6;
- //sbit BF=P0^7;
- /*液晶忙检测
- bit BusyTest(void)
- {
- bit result;
- RS=0;
- RW=1;
- E=1;
- _nop_();
- _nop_();
- _nop_();
- result=BF;
- _nop_();
- _nop_();
- _nop_();
- E=0;
- return result;
- }*/
- /*写指令*/
- void Write_com(unsigned char command)
- {
- // while(BusyTest()!=0);
- RS=0;
- RW=0;
- E=0;
- _nop_();
- _nop_();
- _nop_();
- P0=command;
- _nop_();
- _nop_();
- _nop_();
- E=1;
- _nop_();
- _nop_();
- _nop_();
- E=0;
- }
- /*写地址*/
- void Write_Address(unsigned char address)
- {
- Write_com(address);
- delay1ms(1);
- }
- /*写数据*/
- void Write_Date(unsigned char date)
- {
- RS=1;
- RW=0;
- E=0;
- _nop_();
- _nop_();
- _nop_();
- P0=date;
- _nop_();
- _nop_();
- _nop_();
- E=1;
- _nop_();
- _nop_();
- _nop_();
- E=0;
- delay1ms(1);
- }
- /*初始化*/
- void Lcd_Int(void)
- {
- Write_com(0x38);
- delay1ms(1);
- Write_com(0x38);
- Write_com(0x38);
- delay1ms(1);
- delay1ms(1);
- Write_com(0x06);
- delay1ms(1);
- Write_com(0x0c);
- delay1ms(1);
- Write_com(0x01);
- }
- void writelcd(unsigned char a,b,dat)
- {
- if(b==1)
- {
- Write_Address(0x80+a);
- Write_Date(dat);
- }
- else
- {
- Write_Address(0xc0+a);
- Write_Date(dat);
- }
- }
- void main()
- {
- unsigned char mode = 0;
- int k_cnt = 0;
- TMOD = 0x01;
- TH0 = 0x0EC;
- TL0 = 0x78;
- EA = 1;
- ET0 = 1;
- TR0 = 0;
- Lcd_Int();
- mode = 1;//默认为随机的
- while(1)
- {
- if(key==0)
- {
- delay1ms(10);
- if(key==0)
- {
- TR0=1;
- }
- while(!key);
- TR0=0;
- mode = 1; //随机
- }
- else if(key2==0)
- {
- delay1ms(10);
- if(key2==0)
- {
- while(!key2);
- mode = 2;//顺序
- k_cnt ++;
- if(k_cnt >=46)
- k_cnt = 0;
- }
- }
- else if(key3==0)
- {
- delay1ms(10);
- if(key3==0)
- {
- while(!key3);
- mode = 3;//倒序
- k_cnt --;
- if(k_cnt <= 0)
- k_cnt = 45;
- }
- }
- if(mode == 1)
- {
- x = sj_x_cnt;
- y = sj_y_cnt;
- }
- else
- {
- x = cheng[k_cnt][0];
- y = cheng[k_cnt][1];
- }
- z=x*y;
- Write_Address(0x80);
- if(x/10!=0)
- Write_Date(0x30+x/10);
- Write_Date(0x30+x%10);
- Write_Date('*');
- if(y/10!=0)
- Write_Date(0x30+y/10);
- Write_Date(0x30+y%10);
- Write_Date('=');
- if(z/1000!=0)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
1602LCD随机模拟显示乘法口诀.rar
(54.06 KB, 下载次数: 52)
|