📄 shewang.lst
字号:
C51 COMPILER V8.09 SHEWANG 04/03/2009 17:17:52 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE SHEWANG
OBJECT MODULE PLACED IN shewang.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE shewang.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //晶振采用12MHz 用 自己做的双面板平台 采用扫描法
2 //此程序经测试OK,可以放心使用,数码管与lcd1602上显示。
3 //日期:2009-01-05 21:10
4 //设计人:佘望胜
5 #include<reg52.h>
6 #define uchar unsigned char
7 #define uint unsigned int
8 /*uchar code Dis_Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
9 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
10 uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管的位说明 【ME500】*/
11 //0xfe=P20 0xfd=P21 0xfb=P22 0xf7=P23 0xef=P24 0xdf=P25 0xbf=P26 0x7f=P27 数码管
12 //的位说明 【ME500】
13 uchar data irtab[4]={0x00,0x62,0x21,0x00}; //定义4个数组,用来存储IR码值
14 uchar code lcd_data_list[]={"0123456789ABCDEF"}; //定义字符表
15 uchar user[]="User Code:"; //定义字符串
16 uchar date[]="Data Code:"; //定义字符串
17 //uchar count_time; //定义数码管计时用变量
18 //extern void _nop_(void);
19 sbit remote=P2^0;
20 sbit beep=P2^1;
21 sbit lcd_rs=P3^7;
22 sbit lcd_rw=P3^6;
23 sbit lcd_en=P3^5;
24 void disp();
25 //====================================================================
26 /*delay1ms(uint h) //12mhz 刚好999us
27 {
28 uint i,j;
29 for(i=0;i<h;i++)
30 for(j=0;j<121;j++);
31 }*/
32 //====================================================================
33 delay100us() //12mhz 经过测试刚好100us
34 {
35 1 uchar i,j;
36 1 for(i=5;i>0;i--)
37 1 for(j=8;j>0;j--);
38 1 }
39 //====================================================================
40 void delay_beep(uchar k)
41 {
42 1 uchar i,j; // 12MHz //j=41,经过测试刚好是101us
43 1 for(i=k;i>0;i--)
44 1 for(j=10;j>0;j--);
45 1 }
46 //=====================================================================
47 void delay_lcd(uchar k)
48 {
49 1 uchar i,j; // 12MHz //j=41,经过测试刚好是101us
50 1 for(i=k;i>0;i--)
51 1 for(j=41;j>0;j--);
52 1 }
53 //====================================================================
54 void Sound()
55 {
C51 COMPILER V8.09 SHEWANG 04/03/2009 17:17:52 PAGE 2
56 1 uint k;
57 1 for (k=120;k>0;k--) //此k的数值越大,声音就会越响
58 1 {
59 2 beep=~beep;
60 2 delay_beep(6); //此延时里面的数越大,声音就会持续越长
61 2 }
62 1 }
63 //===========读32个码值 初始化=========================================
64 read_remote()
65 {
66 1 uchar s,q,k,count;
67 1 if(remote==0)
68 1 {
69 2 for(k=85;k>0;k--) //100us重复85次,测得时间8.926ms
70 2 {
71 3 delay100us();
72 3 if(remote==1){return;} //再来判断ir是否为低电平,如果是低电平就执行下面的语句
73 3 }
74 2 while(!remote); //等待4.5ms的高电平
75 2 for(k=23;k>0;k--) //100us重复23次,测得时间2.416ms
76 2 {
77 3 delay100us();
78 3 if(remote==0){return;}
79 3 }
80 2 for(k=15;k>0;k--) //100us重复16次,测得时间1.681ms
81 2 { //100us重复15次,测得时间1.561ms
82 3 delay100us();
83 3 if(remote==0){return;} //再判断ir是不是等于0,是就跳出。如果不是就进入while(ir)处进行等待用户码的到了
84 3 }
85 2 while(remote); //等待0
86 2 //===================================开始读32个码======================
87 2 for(s=0;s<4;s++) //循环4次读完客户码,客户反吗;数据码,数据反码。
88 2 {
89 3 for(q=0;q<8;q++) //8位为一个字节
90 3 {
91 4 while(!remote); //等待4.5ms的高电平
92 4 for(k=9;k>0;k--) //100us重复9次,测得时间928us
93 4 { //100us重复8次,测得时间825us
94 5 delay100us();
95 5 }
96 4 if(remote==1) //判断ir是不是为高电平
97 4 {
98 5 for(k=10;k>0;k--) //100us重复10次,测得时间1.031ms
99 5 { //100us重复11次,测得时间1.134ms
100 6 delay100us();
101 6 }
102 5 count=count>>1;
103 5 count=count|0x80;
104 5 }
105 4 else count=count>>1;
106 4 }
107 3 irtab[s]=count;
108 3 count=0;
109 3 } //========================读完了32个码=================================
110 2 if(irtab[0] != ~irtab[1] && irtab[2] != ~irtab[3]){return;} //核对有没有读到用户误码与数据误码
111 2 disp(); //解码成功后刷新LCD屏
112 2 Sound(); //解码成功后蜂鸣器会响一下
113 2 }
114 1 } //=========================读码完全结束======================
115 //===============================================数码管初始化=============================================
-===
116 /*void initial() //初始化
C51 COMPILER V8.09 SHEWANG 04/03/2009 17:17:52 PAGE 3
117 {
118 EA=1;
119 ET1=1;
120 TMOD=0x10; //t1方式1
121 TH1=(65536-5000)/256;
122 TL1=(65536-5000)%256;
123 TR1=1;
124 }
125 //===================================================数码管中断===========================================
-=====
126 void time() interrupt 3
127 {
128 TH1=(65536-1000)/256;
129 TL1=(65536-1000)%256;
130 count_time++; //用来数码管计时用的
131 switch(count_time)
132 {
133 case 1: P0=Dis_Data[irtab[3]%16]; //显示数据反码
134 P2=wei[7]; //数码管的个位
135 break;
136 case 2: P0=Dis_Data[irtab[3]/16]; //显示数据反码
137 P2=wei[6]; //数码管的十位
138 break;
139 case 3: P0=Dis_Data[irtab[2]%16]; //显示数据码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -