单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库)
這幾天我又對程序進行了修改——將AD檢測過程與屏幕刷新過程分離,大大提高了檢測速度。(此外我將程序修改為5秒自動刷新,以方便觀察。)
修改后的main.c如下。
#include #include"XPT2046.h"
#define uint unsigned int
#define uchar unsigned char
uchar xdata a[128];
sbit RS=P2^6; //這個是LCD的數據命令選擇端
sbit RW=P2^5; //這個是LCD的寫入或是讀出選擇端
sbit RST=P1^0; //這個是LCD的復位端口
sbit LCDE=P2^7; // 這個是LCD的使能端
sbit PSB=P3^2;
void delay(uchar i)
{
while(i--);
}
void delayms(uint c)? ?//誤差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void lcd_busy()
{
RS=0;
RW=1;
P0=0XFF;
LCDE=1;
delay(14);
while((P0&0x80)==0x80);
LCDE=0;
}
void write_com(uchar com)
{
lcd_busy();RS=0;
RW=0;
LCDE=0;
P0=com;
delay(9);
LCDE=1;
delay(9);
LCDE=0;
}
void write_num(uchar num)
{
lcd_busy();
RS=1;
RW=0;
LCDE=0;
P0=num;
delay(7);
LCDE=1;
delay(9);
LCDE=0;
}
uchar read_data()
{
uchar read;
lcd_busy();
RS=1;
RW=1;
LCDE=0;
delay(7);
LCDE=1;
delay(9);
read=P0;
LCDE=0;
delay(11);;
return read;
}
void clear_lcd()
{
uchar i,j;
write_com(0x34);
for(i=0;i<32;i++)? ?? ?? ?? ? //因為LCD有縱坐標32格所以寫三十二次
{
write_com(0x80+i);? ?? ?? ?//先寫入縱坐標Y的值
write_com(0x80);? ?? ?? ?//再寫入橫坐標X的值
for(j=0;j<32;j++)? ?? ?? ?//橫坐標有16位,每位寫入兩個字節的的數據,也就寫入32次
{? ?? ?? ?? ?? ?? ?? ?? ? //因為當寫入兩個字節之后橫坐標會自動加1,所以就不用再次寫入地址了。
write_num(0x00);
}
}
write_com(0x36);
write_com(0x30);
}
void put_point(uchar x,uchar y)
{
uint bt=0,read=0;
uchar x_adr,y_adr,h_bit,l_bit;
y_adr=0x80+y2;? ?? ?? ?? ?//計算Y軸的地址,應為縱坐標有64個,所有對32求余,當Y大于31時,Y的坐標是下半屏的。
if(y>31) //計算X軸的地址當Y大于31時X的地址在下半屏,從0X88開始,小于31時X的地址是在上半屏,從0X80開始
x_adr=0x88+x/16;
else
x_adr=0x80+x/16;
bt=0x8000>>(x); //求這個點到底是在哪個點
write_com(0x34);
write_com(0x34);
write_com(y_adr);? ???//讀取數據的時候要先寫入所取數據的地址
write_com(x_adr);
read_data();? ?? ?? ?//讀取的第一個字節不要,
read=read_data();? ???//從第二個字節開始接收。
read<<=8;
read|=read_data();
bt=bt|read;
h_bit=bt>>8;
l_bit=bt;
write_com(y_adr);? ???//寫入點的時候,重新寫入地址,因為地址已經改變。
write_com(x_adr);
write_num(h_bit);
write_num(l_bit);
write_com(0x36); //開顯示
write_com(0x30);? ???//轉回基本指令集
}
/*
液晶初始化
*/
void lcd_init()
{
PSB=1;
RST=1;
write_com(0x30);? ???//基本指令操作
write_com(0x0c);? ???//開顯示
write_com(0x01);? ???//清除LCD顯示
}
void main()
{
while(1)
{
uchar x,i,y;
lcd_init();
clear_lcd();
write_com(0x34);
write_com(0x34);
write_com(0x80);
write_com(0x88);
for(i=16;i>0;i--) //畫出X軸
{
write_num(0xff);
}
for(i=0;i<64;i++) //畫出Y軸
{
put_point(0,i);
}
for(i=0;i<128;i++)
{
a[i] = Read_AD_Data(0xE4);
}
for(i=0;i<128;i++)
{
x=i;
y=32-(a[i]/10);
put_point(x,y);
}
write_com(0x36);
write_com(0x30);
delayms(5000);
}
}
總結
以上是生活随笔為你收集整理的单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 响应式织梦模板旅游公司类网站
- 下一篇: 匹配中国人姓名的JavaScript正则