📄 配合12864,549模数转换.txt
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#define write_cmd_addr_0 XBYTE[0x8fff] //写指令地址左
#define read_state_addr_0 XBYTE[0xafff] // 读状态地址左
#define write_data_addr_0 XBYTE[0x9fff] // 写数据地址左
#define read_data_addr_0 XBYTE[0xbfff] //读数据地址左
#define write_cmd_addr_1 XBYTE[0x4fff] //写指令地址右
#define read_state_addr_1 XBYTE[0x6fff] // 读状态地址右
#define write_data_addr_1 XBYTE[0x5fff] // 写数据地址右
#define read_data_addr_1 XBYTE[0x7fff] // 读数据地址右
#define Col_Add 0x40 //列地址
#define Page_Add 0xb8 //行地址
#define Start_line 0xc0 //起始行
//函数声明
void init(void); //初始化函数
void delay_ms(unsigned int n); // 毫秒级延时
void delay_10us(unsigned char n); //微秒级延时
void busy_check(bit sel); // 忙标志判断
void write_cmd(unsigned char command, bit sel); //写命令 sel表示选左右屏 command
//命令字
void write_data(unsigned char mydata, bit sel); // 写数据 sel表示左右屏
//mydata数据 若用data则与关键字data重合,编译不通过
void clear_screen(void); // 清屏
void Chinese_disp(unsigned char y,unsigned char x,unsigned char n,bit sel); // 显示Chinese_character里的一个汉字
void display(void); //调用Chinese_disp函数组成显示
void number_display(unsigned char y,unsigned char x,unsigned char n,bit sel);//显示数字字符
sbit ad_dat=P2^1;
sbit ad_clk=P2^2;
sbit ad_cs=P2^0;
unsigned char i,j,k; //ijk分别代表类似5.00中i=5,j=0,k=0
/*******************
字模,此字体下对应的
点阵为:宽x高=16x16
*******************/
unsigned char code Chinese_character[][32]=
{
{0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00
},//电
{0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00
}, //压
{0x00,0x10,0x10,0x12,0x14,0x1C,0x10,0xF0,0x9F,0x10,0x10,0x10,0x10,0xF8,0x10,0x00,
0x00,0x00,0x40,0x20,0x10,0x08,0x06,0x01,0x00,0x11,0x26,0x40,0x20,0x1F,0x00,0x00
} //为
};
/*************
8x16
数字字符
*************/
unsigned char code number[][16]=
{
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00
}, /*0*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00
}, /*1*/
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00
}, /*2*/
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00
}, /*3*/
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00
}, /*4*/
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00
}, /*5*/
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00
}, /*6*/
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00
}, /*7*/
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00
}, /*8*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
}, /*9*/
{0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00
}, /*V*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00
} /*.*/
};
// 检测忙状态
void busy_check(bit sel) //sel表示选左右屏 01表示左右
{
unsigned char busy;
if(sel) // 根据选择的左右屏读状态
{
while(busy&0x80)
{busy=read_state_addr_1;}
}
else
{while(busy&0x80)
{busy=read_state_addr_0;}
}
}
//写命令
void write_cmd(unsigned char command, bit sel)
{ if(sel)
{
busy_check(1); //先要等不忙了再写命令
write_cmd_addr_1=command;
}
else
{ busy_check(0);
write_cmd_addr_0=command;
}
}
// 写数据
void write_data(unsigned char mydata,bit sel)
{if(sel)
{busy_check(1);
write_data_addr_1=mydata; //先要等不忙了再写数据
}
else
{busy_check(0);
write_data_addr_0=mydata;
}
}
// 清屏
void clear_screen(void)
{
unsigned char i;
unsigned char k;
write_cmd(Col_Add,0); //定位左屏启始为第0列
for(i=0;i<8;i++)
{
write_cmd(Page_Add+i,0); //定位第i页
for(k=0;k<64;k++)
{write_data(0x00,0);} //写数据0x00,即空白
}
write_cmd(Col_Add,1); //定位右屏启始为第0列
for(i=0;i<8;i++)
{
write_cmd(Page_Add+i,1); //定位第i页
for(k=0;k<64;k++)
{write_data(0x00,1);} //写数据0x00,即空白
}
}
// 显示汉字
//y表示启始页码,x表示启始列,n表示数组Chinese_character代号,sel表左右屏
void Chinese_disp(unsigned char y,unsigned char x,unsigned char n,bit sel)
{ unsigned char xx,i;
unsigned char j;
if (sel)
{
for(i=0;i<2;i++)
{ write_cmd(Page_Add+y+i,1);
write_cmd(Col_Add+x,1);
for(j=0;j<16;j++)
{ write_data(Chinese_character[n][16*i+j],1); }
}
}
else
{
for(i=0;i<2;i++)
{ sel=0;
write_cmd(Page_Add+y+i,0);
write_cmd(Col_Add+x,0);
for(j=0;j<16;j++) //写了一个数据,x自动回加1
{
xx=x+j;
//切记此处用==,若用=就成了赋值语句了,谨记
if(xx==64) //判断是否超过64列
{
sel=1;
write_cmd(Page_Add+y+i,1);
write_cmd(Col_Add,1);
}
else
{write_data(Chinese_character[n][16*i+j],sel);}
}
}
}
}
//显示数字0-9
//y表示启始页码,x表示启始列,n表示数组number代号,sel表左右屏
void number_display(unsigned char y,unsigned char x,unsigned char n,bit sel)
{ unsigned char xx,i;
unsigned char j;
if (sel)
{
for(i=0;i<2;i++)
{ write_cmd(Page_Add+y+i,1);
write_cmd(Col_Add+x,1);
for(j=0;j<8;j++)
{ write_data(number[n][8*i+j],1); }
}
}
else
{
for(i=0;i<2;i++)
{ sel=0;
write_cmd(Page_Add+y+i,0);
write_cmd(Col_Add+x,0);
for(j=0;j<8;j++) //写了一个数据,x自动回加1
{
xx=x+j;
//切记此处用==,若用=就成了赋值语句了,谨记
if(xx==64) //判断是否超过64列
{
sel=1; //超过64列则从右屏起始地址开始写
write_cmd(Page_Add+y+i,1);
write_cmd(Col_Add,1); //定义开始在第0列
}
write_data(number[n][8*i+j],sel);
}
}
}
}
void delay_10us(unsigned char n) // 微秒级延时
{do
{_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
void delay_ms(unsigned int n) // 毫秒级延时
{
do delay_10us(131);
while(--n);
}
void init(void) //12864初始化
{
delay_ms(200); //延时,给12864时间接受数据
write_cmd(0xc0,0); //设定左屏start_line
delay_ms(5);
write_cmd(0x3f,0); // 开显示,0x3f开,0x3e关
delay_ms(200); //与左屏一样对右屏
write_cmd(0xc0,1);
delay_ms(5);
write_cmd(0x3f,1);
}
unsigned char ad_ctr()
{
unsigned char data i,j,k;
ad_dat=1;
ad_clk=0; //clock线在cs有效前须为低电平,根据549工作时序图知
ad_cs=0; //片选cs,低电平有效
for(i=0;i<8;i++)
{
j=j<<1; //高位在前,低位在后
k=ad_dat; //共移出8位数据
ad_clk=1; //制造一个下降沿使下一位到输出寄存
ad_clk=0;
j=j+k;
}
ad_cs=1;
return j; //返回转换结果
}
void ad_deal() //ad结果处理
{ unsigned int data ad;
ad=ad_ctr(); /*读两次,因为第一次读到的是上一次转换的数据,所以读两次*/
ad=2*ad_ctr(); /*5.05v对应8位,即256个数,近似认为1个数代表0.02 v*/
i=ad/100;
ad=ad%100; //分别求i,j,k
j=ad/10;
ad=ad%10;
k=ad;
}
void display(void) //显示函数
{
Chinese_disp(0,16,0,0);
Chinese_disp(0,32,1,0);
Chinese_disp(0,48,2,0);
number_display(2,16,i,0);
number_display(2,24,11,0);
number_display(2,32,j,0);
number_display(2,40,k,0);
number_display(2,48,10,0);
}
//主程序
void main(void)
{
init();
clear_screen();
_nop_();
while(1)
{ ad_deal(); //实时处理,主程序中不断采样
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -