久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
stc12c5a60s2驅動LCD12864(轉)
[打印本頁]
作者:
Y!NG
時間:
2016-11-19 16:28
標題:
stc12c5a60s2驅動LCD12864(轉)
#include <stc12c5a60s2.h>
#include<intrins.h>
#include<math.h>
#define u8 unsigned char
#define u16 unsigned int
#define clear 0x01 //清屏
#define reset_DDRAM 0x02 //DDRAM地址歸位
#define left_move 0x04 //游標左移
#define right_move 0x06 //游標右移
#define all_left_move 0x05 //畫面整體左移
#define all_right_move 0x07 //畫面整體右移
#define display_left_move 0x10 //顯示游標左移
#define display_right_move 0x14 //顯示游標右移
#define set_function1 0x30 //基本指令集動作
#define set_CGRAM 0x40 //設定CGRAM地址
#define set_DDRAM 0x80 //設定DDRAM地址
#define set_function2 0x34 //擴充指令集動作
#define fanbai 0x04 //反白第一行(擴充指令集)
#define set_GDRAM 0x80 //設定GDRAM地址(擴充指令集)
#define ON_G 0x36 //開繪圖顯示(擴充指令集)
#define set_function2 0x34 //關繪圖顯示(擴充指令集)
sbit LCD_CS=P1^0;
sbit LCD_SID=P1^1;
sbit LCD_SCLK=P1^2;
sbit psb=P1^3;
sbit rst=P1^4;
u8 code a[]={"1234567890"};
void P1_init()
{
P1M0=0X00;
P1M1=0X00;
psb=0;
rst=1;
}
void Delay_nms(u8 n)
{
u8 i;
u8 j;
for(i=0;i<n;i++)
for(j=0;j<200;j++) //大概1ms
_nop_();
}
void LCD_sendbyte(u8 byte)
{
u8 i;
for(i=0;i<8;i++)
{
LCD_SCLK=0; //拉低時鐘線
_nop_();
LCD_SID=(bit)(byte&0x80); //發送最高位數據
LCD_SCLK=1; //上升沿發送數據
byte=byte<<1; //左移一位
}
}
void LCD_write_com(u8 com)
{
LCD_CS=1;
LCD_sendbyte(0xf8); //送入5個連續的“1“,啟動一個周期,11111,RW(0),RS(0),0
LCD_sendbyte(0xf0&com); //取高四位,數據分兩次傳送,
//每個字節的內容被送入兩個字節
//高四位放在第一個字節的高四位
LCD_sendbyte(0xf0&(com<<4)); //低四位放在第二個字節的高四位
LCD_CS=0;
Delay_nms(10); //串行不支持讀操作,不可檢測忙操作,這里用延時替代
}
void LCD_write_dat(u8 dat)
{
LCD_CS=1;
LCD_sendbyte(0xfa); //送入5個連續的“1“,啟動一個周期,11111,RW(0),RS(1),0
LCD_sendbyte(0xf0&dat); //取高四位,數據分兩次傳送,
//每個字節的內容被送入兩個字節
//高四位放在第一個字節的高四位
LCD_sendbyte(0xf0&(dat<<4)); //低四位放在第二個字節
LCD_CS=0;
Delay_nms(10);
}
void LCD_init(void)
{
LCD_write_com(0x30); //選擇基本指令集
LCD_write_com(0x0c); //開顯示,無游標,不反白
LCD_write_com(0x01); //清除顯示屏幕,把DDRAM位址計數器調整為00H
Delay_nms(5); //清屏操作時間較長1.6ms 因此加此延時
LCD_write_com(0x02); //清DDRAM位址歸位,此處貌似與清屏重復
LCD_write_com(0x06); //設定光標右移,整體顯示不移動
}
void print(u8 *s)
{
while(*s!='\0')
{
LCD_write_dat(*s);
s++;
}
}
void LCD_Setaddress(u8 x,u8 y)
{ //地址從第1行第1列開始不從0開始
u8 addr;
switch(x)
{
case 1: addr=0x80+y-1;
break;
case 2: addr=0x90+y-1;
break;
case 3: addr=0x88+y-1;
break;
case 4: addr=0x98+y-1;
break;
default : break;
}
LCD_write_com(addr); //字符顯示開始地址
}
void LCD_Putstring( u8 x, u8 y, u8 *pData )
{
LCD_Setaddress(x,y);
while( *pData != '\0' )
{
LCD_write_dat( *pData++ );
}
}
/*---------------------------------------------------------------------------------------------------------------------- */
//打點繪圖,適用于在屏幕上打稀疏的幾個點,不能用于橫行連續打點
void LCD_draw_point(u8 x, u8 y)
{
u8 x_byte, x_bit; //在橫坐標的哪一個字節,哪一個位
u8 y_byte, y_bit; //在縱坐標的哪一個字節,哪一個位
x_byte=x/16; //算出它在哪一個字節(地址)
//注意一個地址是16位的
x_bit=x%16; //(取模)算出它在哪一個位
y_byte=y/32; //y是沒在哪個字節這個說法
//這里只是確定它在上半屏(32行為一屏)還是下半屏
//0:上半屏 1:下半屏
y_bit=y%32; //y_bit確定它是在第幾行
LCD_write_com(0x34); //打開擴展指令集
LCD_write_com(0x80+y_bit); //垂直地址(上) 貌似與說明書正好相反
LCD_write_com(0x80+x_byte+8*y_byte); //先寫水平坐標(下) 貌似與說明書正好相反 ???????
//具體參照數據手冊
//下半屏的水平坐標起始地址為0x88
//(+8*y_byte)就是用來確定在上半屏還是下半屏
if(x_bit<8) //如果x_bit位數小于8
{
LCD_write_dat(0x01<<(7-x_bit)); //寫高字節。因為坐標是從左向右的
//而GDRAM高位在左,低位在右
LCD_write_dat(0x00); //低字節全部填0
}
else
{
LCD_write_dat(0x00); //高字節全部填0
LCD_write_dat(0x01<<(15-x_bit));
}
LCD_write_com(0x36); //打開繪圖顯示
LCD_write_com(0x30); //回到基本指令集
}
/************************************/
//打點繪圖 一次打水平一行 可以避免斷點現象
//x表示數組的首地址,y表示縱坐標的值,也即是表示第多少行
//即對一個數組中的數進行這樣的處理:
//檢測數組,并默認數組為一行數的記錄即128字節,只要數組中有數等于y,就把第y行的數全部打出
/************************************/
void LCD_draw_word(u8 *x, u8 y)
{
u8 i,j,k,m,n,count=0;
u8 hdat, ldat;
u8 y_byte, y_bit; //在縱坐標的哪一個字節,哪一個位
u8 a[16];
LCD_write_com(0x34); //打開擴展指令集
y_byte=y/32; //y是沒在哪個字節這個說法
y_bit=y%32; //y_bit確定它是在第幾行
for(j=0;j<8;j++)
{
hdat=0, ldat=0; //此處清零是很必要的
n=j*16;
for(k=n;k<n+16;k++)
{
if(x[k]==y)
{
a[count]=k;
count++;
}
}
for(m=0;m<count;m++)
{
i=a[m]-n;
if(i<8) //如果x_bit位數小于8
hdat=hdat|(0x01<<(7-i)); //寫高字節。因為坐標是從左向右的
else
ldat=ldat|(0x01<<(15-i));
}
LCD_write_com(0x80+y_bit); //垂直地址(上) 貌似與說明書正好相反
LCD_write_com(0x80+j+8*y_byte); //水平坐標(下) 貌似與說明書正好相反
LCD_write_dat(hdat);
LCD_write_dat(ldat);
}
LCD_write_com(0x36); //打開繪圖顯示
LCD_write_com(0x30); //回到基本指令集
}
/**********************************************************/
//清圖形程序
/**********************************************************/
void LCD_draw_clr(void)
{
u8 i,j;
LCD_write_com(0x34); //8Bit擴充指令集,即使是36H也要寫兩次
LCD_write_com(0x36); //繪圖ON,基本指令集里面36H不能開繪圖
for(i=0;i<32;i++) //12864實際為256x32
{
LCD_write_com(0x80+i); //行位置 貌似與說明書正好相反 (上)
LCD_write_com(0x80); //列位置 貌似與說明書正好相反 (下)
for(j=0;j<32;j++) //256/8=32 byte
LCD_write_dat(0);
}
LCD_write_com(0x30); //開基本指令集
}
/*----------------------------------------------------------------------------------------------------------------------*/
/******************************************************/
//畫正弦波的波形
/******************************************************/
void print_sinx(void)
{
u8 i;
u8 xdata y_sin[128]; //定義屏幕上要打的正弦波的縱坐標
u8 code v[128]={32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,};
float y;
for(i=0;i<128;i++)
{
y=31*sin(0.09*i)+0.5; //此處系數為31比較好
y_sin[i]=32-y;
}
for(i=0;i<64;i++)
LCD_draw_word(y_sin, i); //繪圖 一行一行繪
LCD_draw_word(v, 32);
}
/******************************************************/
//主函數
//用于觀看顯示效果
/******************************************************/
void main(void)
{
P1_init();
LCD_init();
LCD_Setaddress(2,3);
print("您在使用");
LCD_Putstring(3,3,a);
// LCD_write_dat(0x35);
LCD_draw_clr();
print_sinx();
while(1);
}
作者:
風乘
時間:
2018-6-23 08:43
樓主可以說一下這個接線怎么接嗎 單片機小白一個
作者:
謝小康4
時間:
2018-12-6 08:39
找了兩天的12864串口畫線程序,終于找到了,絕世好帖。。。。。。。。。”仨氻
作者:
謝小康4
時間:
2018-12-6 08:41
風乘 發表于 2018-6-23 08:43
樓主可以說一下這個接線怎么接嗎 單片機小白一個
他這個RS RW E分別接P0 P1 P2
作者:
小丑only
時間:
2018-12-20 15:17
學習下
作者:
hellod
時間:
2019-7-24 21:31
學習下
作者:
pengyongnet
時間:
2020-1-14 01:34
不錯高手
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美一级在线观看
|
成人午夜视频在线观看
|
一区二区视频免费观看
|
久久99精品国产自在现线小黄鸭
|
av在线黄
|
亚洲第一在线
|
99热精品久久
|
亚洲午夜av久久乱码
|
天天操精品视频
|
福利精品在线观看
|
色资源站
|
一本岛道一二三不卡区
|
国产xxxx岁13xxxxhd
|
日日拍夜夜
|
国产精品2
|
亚洲国产区
|
国产精品一区二区日韩
|
国产一区久久
|
黑人粗黑大躁护士
|
少妇性l交大片免费一
|
亚洲成人免费av
|
欧美一级久久久猛烈a大片 日韩av免费在线观看
|
日本久久一区二区三区
|
日一日操一操
|
亚洲精品一区二区三区丝袜
|
精品成人av
|
四虎影视1304t
|
综合精品
|
国产精品久久
|
99精品国产一区二区三区
|
欧洲视频一区
|
毛片一级片
|
成人国产精品色哟哟
|
精品啪啪
|
黄色一级大片在线免费看产
|
黄色a三级
|
性生生活大片免费看视频
|
99国产精品视频免费观看一公开
|
在线观看一区
|
免费日韩av网站
|
色婷婷综合久久久中文字幕
|