msp430,AD轉換1602顯示仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (14.84 KB, 下載次數: 70)
下載附件
2019-5-24 01:14 上傳
0.png (9.8 KB, 下載次數: 70)
下載附件
2019-5-24 01:14 上傳
單片機源程序如下:
- /******************************************************************
- * 實驗名稱:LCD1602 顯示仿真 (MSP430F249)
- *
- * 實驗說明:
- * 通設置系統主時鐘(MCLK=8Mhz ) 、輔助時鐘(ACLK=8Mhz )、
- * 子系統時鐘(SMCLK=8Mhz )
- * 編譯軟件:Embedded Workbench 5.3
- *
- *仿真軟件:proteus7.7 sp 2
- ******************************************************************/
- #include <MSP430x24x.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- /**************定義接口************************/
- #define LCDIO P1OUT
- #define LCD1602_RS_1 P2OUT|=1
- #define LCD1602_RS_0 P2OUT&=~1
- #define LCD1602_RW_1 P2OUT|=2
- #define LCD1602_RW_0 P2OUT&=~2
- #define LCD1602_EN_1 P2OUT|=4
- #define LCD1602_EN_0 P2OUT&=~4
- /**************定義函數************************/
- void LCD_write_command(unsigned char command);//寫入指令函數
- void LCD_write_dat( unsigned char dat);//寫入數據函數
- void LCD_set_xy( unsigned char x, unsigned char y );//設置顯示位置函數
- void LCD_dsp_char( unsigned char x,unsigned char y, char dat);//顯示一個字符函數
- void LCD_dsp_string(unsigned char X,unsigned char Y,const char *s);//顯示字符串函數
- void LCD_init(void);//初始化函數
- void delay_nms(unsigned int n);//延時函數
- /********************************************/
- void delayms(uint t)
- {
- uint i;
- while(t--)
- for(i=1330;i>0;i--);//進過參數的調整
- }
- /*******檢查忙函數*************/
- void LCD_check_busy() //實踐證明,在我的LCD1602上,檢查忙指令通過率極低,以
- { //至于不能正常使用LCD。因此我沒有再用檢查忙函數。而使
-
- P1DIR=0x00;
- LCDIO=0xff;
- LCD1602_RS_0; //要用200次循環便能完成。
- LCD1602_RW_1;
- LCD1602_EN_1;
- while(P1IN&0x80);
- LCD1602_EN_0;
- P1OUT=0x00;
- P1DIR=0xFF;
- }
- /******************************/
- /**************寫指令函數********************************/
- void LCD_write_command(unsigned char command)
- {
-
- //LCD_check_busy(); //加上這句仿真無法通過
-
- LCD1602_RS_0;
- LCDIO=command;
- LCD1602_EN_1;
-
- //delayms(1);
- LCD1602_EN_0;
- delayms(1);
-
- }
- /***************************************************/
- /****************寫數據函數************************/
- void LCD_write_dat( unsigned char dat)
- {
- //LCD_check_busy(); //加上這句仿真無法通過
- LCD1602_RS_1;
- LCDIO=dat;
- LCD1602_EN_1;
-
- //delayms(1);
- LCD1602_EN_0;
- delayms(1);
- LCD1602_RS_0;
- }
- /****************************************************/
- /***************設置顯示位置**************************/
- void LCD_set_xy( unsigned char x, unsigned char y )
- {
- unsigned char address;
- if (y == 1)
- address = 0x80+x;
- else if (y == 2)
- {
- address=0x80+0x40+x;
-
- }
- LCD_write_command(address);
- }
- /***************************************************/
- /****************顯示一個字符**********************/
- void LCD_dsp_char( unsigned char x,unsigned char y, char dat)
- {
- LCD_set_xy( x, y );
- LCD_write_dat(dat);
- }
- /**********************************************/
- /***************顯示字符串函數***************/
- void LCD_dsp_string(unsigned char X,unsigned char Y,const char *s)
- {
- uchar len,List;
- len=strlen(s);
- LCD_set_xy( X, Y );
- for(List=0;List<len;List++)
- //LCD_dsp_char(X+List,Y,s[List]);
- LCD_write_dat(s[List]);
-
- }
- /***********************************************/
- /********** 延時**********************/
- void delay_nms(unsigned int n)
- {
- unsigned int i=0,j=0;
- for (i=n;i>0;i--)
- for (j=0;j<10;j++);
- }
- /**************************************/
- /************初始化函數****************/
- void LCD_init(void)
- {
- LCD1602_RW_0;
- LCD1602_EN_0;
- //CLEARSCREEN;//clear screen
- LCD_write_command(0x38);//set 8 bit data transmission mode
- delayms(1);
- LCD_write_command(0x38);//set 8 bit data transmission mode
- delayms(1);
- LCD_write_command(0x38);//set 8 bit data transmission mode
- delayms(1);
- LCD_write_command(0x06);//open display (enable lcd display)
- delayms(1);
- LCD_write_command(0x0C);//set lcd first display address
- delayms(1);
- LCD_write_command(0x01);//clear screen
- delayms(1);
- //LCD_write_command(0x80);//clear screen
- //delayms(1);
- }
- /****************************************************/
- void main(void)
- {
-
- WDTCTL=WDTPW + WDTHOLD; // 關閉看門狗
- P1DIR=0xFF; // 設置方向
- P1SEL=0; // 設置為普通I/O 口
-
- P2DIR=0xFF; // 設置方向
- P2SEL=0; // 設置為普通I/O 口
-
- P2OUT=0x00;
- P1OUT=0x00;
- delayms(200);
- LCD_init();
-
- while(1)
- {
-
- LCD_dsp_string(1,1," LCD TEST ");//在第一行第一列顯示"LCD TEST"
- LCD_dsp_string(1,2," SUCCSEEE! ");//在第一行第一列顯示"LCD TEST"
- _BIS_SR(LPM0_bits+ GIE);//進入低功耗睡眠模式
- }
-
- }
復制代碼
所有資料51hei提供下載:
LCD1602.rar
(243.5 KB, 下載次數: 59)
2019-5-23 10:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|