📄 lcdmain.c
字号:
//=============================================================
//编码器监测C51程序
//自动调节5,12,24V电压,实时显示电压,电流,转速,脉冲数,温度等内容
//兼容增量式,绝对式二进制,格雷码,SSI协议输入
//采用绘图模式实现12*12汉字及8*12字符
//=============================================================
#include<c8051F120.h>
#include<stdio.h>
#include "intrins.h"
#include <ziku.h> //自己定义的字库
#include <math.h>
//-------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit MOSI = P0^0; // 主出/从入(输出)
sbit SCK = P0^2; // 串行时钟(输出)
sbit NSS = P0^3; // 从选择(输出到片选)
sbit tt = P0^4;
//================================================
sbit nRES = P5^0; //reset
sbit hCS_RS = P5^1; //寄存器选择,=H的时候读写数据,=L的时候为泻命令或读取忙标志,输入
sbit SID_RW = P5^2; //=H时为数据或者身份读取,=L时为写数据或命令,输入
sbit SCLK_E = P5^3; //输入,使能口
sbit PSB = P5^4;
//================================================
sbit sel = P4^0;
sbit oe = P4^1;
sbit rst = P4^2;
sbit ssi_dat = P4^3;
sbit ssi_clk = P4^4;
//================================================
sbit key0 = P7^4;
sbit key1 = P7^5;
sbit key2 = P7^6;
sbit key3 = P7^7;
bit flag0=0, flag1 = 0, flagss = 0 ,flag_auto=0;
bit flagkey0=0,flagkey1=0,flagkey2=0,flagkey3=0;
uchar count,countkey0,countkey1,countkey2,countkey3,flag_last=0;
uint count1=0,counttime=0;
//================================================
xdata uint m_point;
xdata struct apple{
uchar wendu; //以度为单位
uint time; //以分钟为单位
uchar dian; //V为单位
uchar dianliu; //mA为单位
ulong shu; //出现跳变的位置
} apples[300];
struct apple *point;
//================================================
void timer0(void) interrupt 1 using 1 //定时以及扫描按键
{
TR0=0;
TF0 = 0;
TH0 = 0x00; // Timer 0 High Byte
TL0 = 0x00; // Timer 0 Low Byte
TR0=1;
if(++count==15)
{
count = 0;
count1++;
if(count1==100)
{
count1 = 0;
counttime++;
}
}
SFRPAGE=CONFIG_PAGE;
if(key0==0) //flagkey0的清零在主程序里执行
{
if(++countkey0==5)
{
countkey0=0;
if(flagss==1)
{
flagss = 0; //为了防止出现计数滞后所以在中断中停止
}
else
flagkey0 = 1;
}
}
else
countkey0=0;
if(key1==0) //flagkey1的清零在主程序里执行
{
if(++countkey1==5)
{
flagkey1 = 1;
countkey1 = 0;
}
}
else
countkey1=0;
if(key2==0) //flagkey2的清零在主程序里执行
{
if(++countkey2==5)
{
flagkey2=1;
countkey2=0;
}
}
else
countkey2=0;
if(key3==0) //flagkey3的清零在主程序里执行
{
if(++countkey3==5)
{
flagkey3=1;
countkey3=0;
}
}
else
countkey3=0;
}
uchar duibi(uchar number1,uchar number2) //根据byte1和byte2和自定义的字库对比提取这个汉字的点阵
{
uchar result;
switch(number1)
{
case 0xb1:
result = 5; //编
break;
case 0xb2:
result = 1; //参
break;
case 0xb3:
if(number2==0xe5)
result = 22; //冲
else
result = 43; //出
break;
case 0xb5:
result = 3; //电
break;
case 0xb6:
if(number2==0xc8)
result = 26; //度
if(number2==0xa8)
result = 9; //定
if(number2 == 0xd4)
result = 41; //对
if(number2 == 0xfe)
result = 46; //二
break;
case 0xb7:
result = 42; //方
break;
case 0xb8:
if(number2==0xf1)
result = 49; //格
else
result = 37; //复
break;
case 0xb9:
result = 31; //工
break;
case 0xbb:
result = 29; //华
break;
case 0xbc:
result = 24; //间
break;
case 0xbd:
result = 47; //进
break;
case 0xbe:
result = 40; //绝
break;
case 0xbf:
result = 30; //控
break;
case 0xc0:
if(number2==0xd7)
result = 50; //雷
else
result = 10; //类
break;
case 0xc1:
if(number2 == 0xf7)
result = 39; //流
if(number2 == 0xbf)
result = 34; //量
break;
case 0xc2:
if(number2 == 0xeb)
result = 6; //码
else
result = 21; //脉
break;
case 0xc6:
result = 7; //器
break;
case 0xc8:
result = 45; //圈
break;
case 0xc9:
result = 8; //设
break;
case 0xca:
if(number2 == 0xfd)
result = 2; //数
if(number2 == 0xe4)
result = 28; //输%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if(number2 == 0xbd)
result = 35; //式8888888888888888888888888888888
if(number2 == 0xb1)
result = 23; //时
break;
case 0xcb:
result = 44; //速
break;
case 0xce:
if(number2 == 0xc2)
result = 25; //温
if(number2 == 0xbb)
result = 36; //位
break;
case 0xcf:
result = 12; //线
break;
case 0xd0:
result = 11; //型
break;
case 0xd1:
if(number2 == 0xa1)
result = 38; //选
if(number2 == 0xb9)
result = 4; //压
break;
case 0xd4:
result = 33; //增
break;
case 0xd6:
result = 48; //制
break;
case 0xd7:
if(number2 == 0xaa)
result = 27; //转
if(number2 == 0xf7)
result = 32; //作
break;
}
return result;
}
unsigned char getlength(char *hanzi) //得到汉字长度
{
char *p=hanzi;
while(*p!='\0')
p++;
return (p-hanzi);
}
//**********************************************************************/
void delay100us(void) //实际是20us
{
uchar i;
for(i=0;i<=85;i++) { _nop_();_nop_(); }
}
void delay1ms(void) //delay TIMER1*1 ms for 12MHz
{
uchar i;
for(i=0;i<=250;i++)
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
}
void delayxms(int i) //delay TIMER1*1 ms for 12MHz
{
for(i=0;i<=250;i++) { delay1ms(); }
}
//------------------------------------------------------------------------------------------------
//读写指令和数据 _nop_()//执行一条空指令
//------------------------------------------------------------------------------------------------
void wr_command(uchar wr_data1) //读写命令;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -