日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库)

發(fā)布時(shí)間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這幾天我又對(duì)程序進(jìn)行了修改——將AD檢測(cè)過(guò)程與屏幕刷新過(guò)程分離,大大提高了檢測(cè)速度。(此外我將程序修改為5秒自動(dòng)刷新,以方便觀察。)

修改后的main.c如下。

#include #include"XPT2046.h"

#define uint unsigned int

#define uchar unsigned char

uchar xdata a[128];

sbit RS=P2^6; //這個(gè)是LCD的數(shù)據(jù)命令選擇端

sbit RW=P2^5; //這個(gè)是LCD的寫(xiě)入或是讀出選擇端

sbit RST=P1^0; //這個(gè)是LCD的復(fù)位端口

sbit LCDE=P2^7; // 這個(gè)是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++)? ?? ?? ?? ? //因?yàn)長(zhǎng)CD有縱坐標(biāo)32格所以寫(xiě)三十二次

{

write_com(0x80+i);? ?? ?? ?//先寫(xiě)入縱坐標(biāo)Y的值

write_com(0x80);? ?? ?? ?//再寫(xiě)入橫坐標(biāo)X的值

for(j=0;j<32;j++)? ?? ?? ?//橫坐標(biāo)有16位,每位寫(xiě)入兩個(gè)字節(jié)的的數(shù)據(jù),也就寫(xiě)入32次

{? ?? ?? ?? ?? ?? ?? ?? ? //因?yàn)楫?dāng)寫(xiě)入兩個(gè)字節(jié)之后橫坐標(biāo)會(huì)自動(dòng)加1,所以就不用再次寫(xiě)入地址了。

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;? ?? ?? ?? ?//計(jì)算Y軸的地址,應(yīng)為縱坐標(biāo)有64個(gè),所有對(duì)32求余,當(dāng)Y大于31時(shí),Y的坐標(biāo)是下半屏的。

if(y>31) //計(jì)算X軸的地址當(dāng)Y大于31時(shí)X的地址在下半屏,從0X88開(kāi)始,小于31時(shí)X的地址是在上半屏,從0X80開(kāi)始

x_adr=0x88+x/16;

else

x_adr=0x80+x/16;

bt=0x8000>>(x); //求這個(gè)點(diǎn)到底是在哪個(gè)點(diǎn)

write_com(0x34);

write_com(0x34);

write_com(y_adr);? ???//讀取數(shù)據(jù)的時(shí)候要先寫(xiě)入所取數(shù)據(jù)的地址

write_com(x_adr);

read_data();? ?? ?? ?//讀取的第一個(gè)字節(jié)不要,

read=read_data();? ???//從第二個(gè)字節(jié)開(kāi)始接收。

read<<=8;

read|=read_data();

bt=bt|read;

h_bit=bt>>8;

l_bit=bt;

write_com(y_adr);? ???//寫(xiě)入點(diǎn)的時(shí)候,重新寫(xiě)入地址,因?yàn)榈刂芬呀?jīng)改變。

write_com(x_adr);

write_num(h_bit);

write_num(l_bit);

write_com(0x36); //開(kāi)顯示

write_com(0x30);? ???//轉(zhuǎn)回基本指令集

}

/*

液晶初始化

*/

void lcd_init()

{

PSB=1;

RST=1;

write_com(0x30);? ???//基本指令操作

write_com(0x0c);? ???//開(kāi)顯示

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--) //畫(huà)出X軸

{

write_num(0xff);

}

for(i=0;i<64;i++) //畫(huà)出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);

}

}

總結(jié)

以上是生活随笔為你收集整理的单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。