- #include"reg52.h"
- #include"12864.h"
- #include"da7621.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- unsigned char a,b,c,j=3;
- void main()
- {
- P0=0xff;
- P2=0xff;
- TMOD=0x01; //设定定时器0为方式1
- EA=1; //开总中断
- EX0=1;
- EX1=1; //打开外部中断允许为位
- IT0=0; //关闭t0定时器中断允许位
- IT1=0;
- //延时
- lcd_init(); //初始化12864液晶
- lcd_display();
- ms=500;
- fro=ms;
- // while(!flag); //等待按键处理
- // flag=0;
- TH0=(65536-917431/fro)/256; //10^6*(1/fro)/(12/11059200)=917431/fro
- TL0=(65536-917431/fro)%256;
- TR0=1;
- while(1)
- {
- write_f(ms);
- key();
- }
- }
- void INT0_key() interrupt 0//键盘扫描
- {
- uchar a,b,c;
- for(c=40;c>0;c--)
- for(b=50;b>0;b--)
- for(a=250;a>0;a--)
- {
- key();
- }
- }
- void INT1_exit_sin() interrupt 2 //退出正弦波输出死循环
- {
- uchar exit;
- exit=1;
- }
- #define uchar unsigned char
- #define uint unsigned int
- //端口定义
- #define LCD_data P0 //数据口
- sbit LCD_RS = P1^5; //寄存器选择输入
- sbit LCD_RW = P1^6; //液晶读写/写控制
- sbit LCD_EN = P1^7; //液晶使能控制
- sbit LCD_PSB= P1^4; //串/并方式控制
- uchar code dis1[]={"频率:"};
- uchar code dis2[]={"Hz"};
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- //写指令数据到LCD
- //RS=L,RW=L,E=高脉冲,D0-D7=指令码
- void write_cmd(uchar cmd)
- {
- LCD_RS=0;
- LCD_RW=0;
- LCD_EN=0;
- P0=cmd;
- delayms(5);
- LCD_EN=1;
- delayms(5);
- LCD_EN=0;
- }
- //写显示数据到LCD
- //RS=H,RW=L,E=高脉冲,D0-D7=数据
- void write_dat(uchar dat)
- {
- LCD_RS=1;
- LCD_RW=0;
- LCD_EN=0;
- P0=dat;
- delayms(5);
- LCD_EN=1;
- delayms(5);
- LCD_EN=0;
- }
- //设定显示位置
- void lcd_pos(uchar X,uchar Y)
- {
- uchar pos;
- if(X==0)
- {X=0x80;}
- else if(X==1)
- {X=0x90;}
- else if(X==2)
- {X=0x88;}
- else if(X==3)
- {X=0x98;}
- pos=X+Y;
- write_cmd(pos); //显示地址
- }
- void lcd_display()
- {
- uchar i;
- lcd_pos(0,0); //设置显示位置为第二行的第一个字符
- i=0;
- while(dis1[i]!='\0')
- {
- write_dat(dis1[i]); //显示字符
- i++;
- }
- lcd_pos(0,6); //设置显示位置为第三行的第一个字符
- i=0;
- while(dis2[i]!='\0')
- {
- write_dat(dis2[i]); //显示字符
- i++;
- }
- }
- //LCD初始化设定
- void lcd_init()
- {
- LCD_PSB=1; //并口方式
- write_cmd(0x30); //基本指令操作
- delayms(5);
- write_cmd(0x0c); //显示开,关光标
- delayms(5);
- write_cmd(0x01); //清除LCD的显示内容
- delayms(5);
- }
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- sbit key1=P3^7;
- sbit key2=P3^6;
- sbit key3=P3^5;
- unsigned char code tab[]={
- 0x800,0x86B,0x8D6,0x940,0x9AA,0xA12,0xA79,0xADE,0xB41,0xBA1,
- 0xC00,0xC5B,0xCB3,0xD08,0xD5A,0xDA7,0xDF1,0xE37,0xE78,0xEB5,
- 0xEED,0xF20,0xF4E,0xF77,0xF9B,0xFB9,0xFD2,0xFE6,0xFF4,0xFFC,
- 0xFFF,0xFFC,0xFF4,0xFE6,0xFD2,0xFB9,0xF9B,0xF77,0xF4E,0xF20,
- 0xEED,0xEB5,0xE78,0xE37,0xDF1,0xDA7,0xD5A,0xD08,0xCB3,0xC5B,
- 0xC00,0xBA1,0xB41,0xADE,0xA79,0xA12,0x9AA,0x940,0x8D6,0x86B,
- 0x800,0x795,0x72A,0x6C0,0x656,0x5EE,0x587,0x522,0x4BF,0x45F,
- 0x400,0x3A5,0x34D,0x2F8,0x2A6,0x259,0x20F,0x1C9,0x188,0x14B,
- 0x113,0xE0,0xB2,0x89,0x65,0x47,0x2E,0x1A,0x0C,0x04,
- 0x01,0x04,0x0C,0x1A,0x2E,0x47,0x65,0x89,0xB2,0xE0,
- 0x113,0x14B,0x188,0x1C9,0x20F,0x259,0x2A6,0x2F8,0x34D,0x3A5,
- 0x400,0x45F,0x4BF,0x522,0x587,0x5EE,0x656,0x6C0,0x72A,0x795};
- unsigned int fro;
- uchar i;
- int ms;
- unsigned char exit=0;
- void write_f(int ms)
- {
- lcd_pos(0,3);
- write_dat(0x30+ms/1000);
- // write_dat('.'); //小数点显示
- write_dat(0x30+ms/100%10);
- write_dat(0x30+ms/10%10);
- write_dat(0x30+ms%10);
- }
- void key()
- {
- if(key1==0)
- {
- delayms(5);
- if(key1==0)
- {
- ms=ms+50;
- if(ms>1000)
- ms=50;
- while(!key1);
- }
- }
- if(key2==0)
- {
- delayms(5);
- if(key2==0)
- {
- ms=ms-50;
- if(ms<100)
- ms=1000;
- while(!key2);
- }
- }
- if(key3==0)
- {
- delayms(5);
- if(key3==0)
- {
- ms=500;
- while(!key3);
- }
- }
- }
- void write_sin()//输出正弦波循环
- {
- if(TF0==1)
- {
- TH0=(65536-917431/fro)/256;
- TL0=(65536-917431/fro)%256;
- TF0=0;
- for(i=0;i<120;i++)
- {
- P2=tab[i]&0xff;
- P1=tab[i]>>8;
- }
- i++;
- if(i>119)
- {
- i=0;
- }
- }
- if(exit==1)
- {
- exit=0;
- TR0=0;
- // break;
- }
- }
复制代码
|