求大神分享一個完整的簡易電子示波器項目,
順便求大神幫看一下自己寫的示波器程序是哪兒出來問題,編譯沒有問題,應該是邏輯上的錯誤,12864連提示詞都不能顯示 ,現在只求出來一個波形,細節問題再調
0.png (64.72 KB, 下載次數: 117)
下載附件
2017-2-26 00:10 上傳
所有資料下載:
示波器程序.7z
(34.2 KB, 下載次數: 22)
2021-10-29 18:25 上傳
點擊文件名下載附件
單片機主程序:
- #include<msp430f169.h>
- #include<stdlib.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define Num_of_Results 100
- static uint results[Num_of_Results];
- uchar index=0;
- #define S1 0
- #define S2 1
- #define S3 2
- #define S4 3
- static unsigned char font3x6[] = {
- 0x00,0x00,0x00, //space
- 0x00,0x04,0x00, //.
- 0x20,0x10,0x08, ///
- 0x7c,0x44,0x7c, //0
- 0x00,0x7C,0x00, //1
- 0x5C,0x54,0x74, //2
- 0x54,0x54,0x7C, //3
- 0x70,0x10,0x7C, //4
- 0x74,0x54,0x5C, //5
- 0x7C,0x54,0x5C, //6
- 0x40,0x40,0x7C, //7
- 0x7C,0x54,0x7C, //8
- 0x74,0x54,0x7C, //9
- };
- const unsigned char tab[]=
- {
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,
- 0x80,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0xE3,0xB8,0x55,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xA2,0x20,0x45,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0xA3,0xB8,0xD5,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xA0,0x89,0x55,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0xEB,0xB8,0xD2,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0xC0,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x18,0x00,0x05,0x25,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x07,0x55,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x05,0x72,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x05,0x55,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x05,0x55,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0x57,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0xC5,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0x55,
- 0xC0,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x18,0x00,0x01,0x55,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0x55,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x05,0x66,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x05,0x55,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x05,0x66,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x05,0x44,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x44,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x58,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xA0,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0xC0,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x18,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x0A,0xA0,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x0B,0xE0,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0xD9,0xCC,0x00,
- 0xC0,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x19,0x15,0x12,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x99,0x92,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x09,0x15,0x12,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x15,0xCE,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0x40,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0x5C,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0xC4,
- 0x80,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x08,0x00,0x01,0x48,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0x5C,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,
- };
- /**************************************************
- ****************lcd12864管腳定義*******************
- **************************************************/
- #define LCD_DataIn P4DIR=0X00
- #define LCD_DataOut P4DIR=0Xff
- #define LCD2MCU_Data P4IN
- #define MCU2LCD_Data P4OUT
- #define LCD_RS_H P5OUT &=~BIT5
- #define LCD_RS_L P5OUT |= BIT5
- #define LCD_RW_H P5OUT &=~BIT6
- #define LCD_RW_L P5OUT |= BIT6
- #define LCD_EN_H P5OUT &=~BIT7
- #define LCD_EN_L P5OUT |= BIT7
- #define LCD_PSB_H P5OUT &=~BIT0
- #define LCD_PSB_L P5OUT |= BIT0
- #define LCD_RST_H P5OUT &=~BIT1
- #define LCD_RST_L P5OUT |= BIT1
- /**************************************************
- 函數名稱:Delay_1ms
- 功 能:延時1ms
- 參 數:無
- 返回值 :無
- **************************************************/
- void Delay_1ms(void)
- {
- uchar i;
- for(i=150;i>0;i--) _NOP();
- }
- void Delay_Nms(uint n)
- {
- uint i;
- for(i=n;i>0;i--) Delay_1ms();
- }
- /**************************************************
- 函數名稱:Write_Cmd
- 功 能:向液晶中寫控制命令
- 參 數:cmd--控制命令
- 返回值 :無
- **************************************************/
- void Write_Cmd(uchar cmd)
- {
- uchar lcdtemp = 0;
- LCD_RS_L;
- LCD_RW_H;
- LCD_DataIn;
- do
- {
- LCD_EN_H;
- _NOP();
- lcdtemp = LCD2MCU_Data;
- LCD_EN_L;
- }
- while(lcdtemp&0x80);
-
- LCD_DataOut;
- LCD_RS_L;
- LCD_RW_L;
- MCU2LCD_Data = cmd;
-
- LCD_EN_H;
- _NOP();
- LCD_EN_L;
- }
- /**************************************************
- 函數名稱:Write_Data
- 功 能:向液晶中寫數據
- 參 數:dat--顯示數據
- 返回值 :無
- **************************************************/
- void Write_Data(uchar dat)
- {
- uchar lcdtemp;
- LCD_RS_L;
- LCD_RW_H;
- LCD_DataIn;
- do
- {
- LCD_EN_H;
- _NOP();
- lcdtemp = LCD2MCU_Data;
- LCD_EN_L;
- }
- while(lcdtemp&0x80);
-
- LCD_RS_H;
- LCD_RW_L;
- LCD_DataOut;
- MCU2LCD_Data = dat;
- LCD_EN_H;
- _NOP();
- LCD_EN_L;
- }
- /**************************************************
- 函數名稱:Ini_lcd
- 功 能:初始化液晶模塊
- 參 數:無
- 返回值 :無
- **************************************************/
- void Ini_lcd(void)
- {
- // Delay_Nms(500);
- Write_Cmd(0x30); //基本指令集
- Delay_1ms();
- Write_Cmd(0x02); // 地址歸位
- Delay_1ms();
- Write_Cmd(0x0c); //整體顯示打開,游標關閉
- Delay_1ms();
- Write_Cmd(0x01); //清除顯示
- Delay_1ms();
- Write_Cmd(0x06); //游標右移
- Delay_1ms();
- Write_Cmd(0x80); //設定顯示的起始地址
- }
- /**************************************************
- 函數名稱:Clear_GDRAM
- 功 能:清除液晶GDRAM中的隨機數據
- 參 數:無
- 返回值 :無
- **************************************************/
- void Clear_GDRAM(void)
- {
- uchar i,j,k;
-
- Write_Cmd(0x34); //打開擴展指令集
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- Write_Cmd(i++);
- Write_Cmd(0x80);
- for(k = 0;k < 16;k++)
- {
- Write_Data(0x00);
- }
- }
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- Write_Cmd(i++);
- Write_Cmd(0x88);
- for(k = 0;k < 16;k++)
- {
- Write_Data(0x00);
- }
- }
- Write_Cmd(0x30); //回到基本指令集
- }
- /**************************************************
- 函數名稱:Lcd_ReadData
- 功 能:讀取12864中一個字節的數據
- 參 數:無
- 返回值 :顯示的數據
- **************************************************/
- uchar Lcd_ReadData()
- {
- unsigned char Data_Temp;
- uchar lcdtemp;
- LCD_RS_L;
- LCD_RW_H;
- LCD_DataIn;
- do
- {
- LCD_EN_H;
- _NOP();
- lcdtemp = LCD2MCU_Data;
- LCD_EN_L;
- }
- while(lcdtemp&0x80);
-
- LCD_RS_H;
- LCD_RW_H;
- LCD_DataIn;
-
- LCD_EN_H;
- _NOP();
- Data_Temp = LCD2MCU_Data;
- LCD_EN_L;
-
- return Data_Temp;
- }
- /**************************************************
- 函數名稱:LCD_Set_Dot
- 功 能:任意位置畫點,但覆蓋原來的數據
- 參 數:X--橫坐標
- Y--縱坐標
- 返回值 :無
- **************************************************/
- void LCD_Set_Dot(uchar X,uchar Y)
- {
- uchar X_byte,X_bit;
- uchar Y_byte,Y_bit;
- X_byte = X<<4;
- X_bit = X%16;
-
- Y_byte = Y<<5;
- Y_bit = Y%32;
-
- Write_Cmd(0x34);
- Write_Cmd(0x80 + Y_bit);
- Write_Cmd(0x80 + X_byte + (Y_byte<<3));
-
- if(X_bit < 8)
- {
- Write_Data(0x01<<(7 - X_bit)) ;
- Write_Data(0x00);
- }
- else
- {
- Write_Data(0x00);
- Write_Data(0x01<<(15 - X_bit));
- }
- Write_Cmd(0x36);
- // Write_Cmd(0x30);
- }
- /**************************************************
- 函數名稱:LCD_Set_Dot1
- 功 能:任意位置畫點,不覆蓋原來的數據
- 參 數:X--橫坐標
- Y--縱坐標
- 返回值 :無
- **************************************************/
- void LCD_Set_Dot1(uchar X,uchar Y)
- {
- uchar X_byte,X_bit,Oldbyte_H;
- uchar Y_byte,Y_bit,Oldbyte_L;
- X_byte = X/16;
- X_bit = X%16;
-
- Y_byte = Y/32;
- Y_bit = Y%32;
-
- // Write_Cmd(0x34);
- Write_Cmd(0x80 + Y_bit);
- Write_Cmd(0x80 + X_byte + (Y_byte<<3));
-
- Lcd_ReadData(); //沒有這一條指令出錯~!
- Oldbyte_H = Lcd_ReadData();
- Oldbyte_L = Lcd_ReadData();
-
- // Write_Cmd(0x34);
- Write_Cmd(0x80 + Y_bit);
- Write_Cmd(0x80 + X_byte + (Y_byte<<3));
- if(X_bit < 8)
- {
- Write_Data((Oldbyte_H) | (0x01<<(7 - X_bit))) ;
- Write_Data(Oldbyte_L);
- }
- else
- {
- Write_Data(Oldbyte_H);
- Write_Data((Oldbyte_L) | (0x01<<(15 - X_bit)));
- }
- Write_Cmd(0x36);
- // Write_Cmd(0x30);
- }
- /**************************************************
- 函數名稱:LCD_ReSet_Dot1
- 功 能:任意位置點復位,不覆蓋原來的數據
- 參 數:X--橫坐標
- Y--縱坐標
- 返回值 :無
- **************************************************/
- void LCD_ReSet_Dot1(uchar X,uchar Y)
- {
- uchar X_byte,X_bit,Oldbyte_H;
- uchar Y_byte,Y_bit,Oldbyte_L;
- X_byte = X/16;
- X_bit = X%16;
-
- Y_byte = Y/32;
- Y_bit = Y%32;
-
- // Write_Cmd(0x34);
- Write_Cmd(0x80 + Y_bit);
- Write_Cmd(0x80 + X_byte + (Y_byte<<3));
- Lcd_ReadData(); //沒有這一條指令出錯~!
- Oldbyte_H = Lcd_ReadData();
- Oldbyte_L = Lcd_ReadData();
-
- // Write_Cmd(0x34);
- Write_Cmd(0x80 + Y_bit);
- Write_Cmd(0x80 + X_byte + (Y_byte<<3));
- if(X_bit < 8)
- {
- Write_Data((Oldbyte_H) & (~(0x01<<(7 - X_bit)))) ;
- Write_Data(Oldbyte_L);
- }
- else
- {
- Write_Data(Oldbyte_H);
- Write_Data((Oldbyte_L) & (~(0x01<<(15 - X_bit))));
- }
- Write_Cmd(0x36);
- // Write_Cmd(0x30);
- }
- /**************************************************
- 函數名稱:Lcd_DrawLine_X
- 功 能:畫橫線
- 參 數:x_start--起始地址x坐標
- x_end --結束地址x坐標
- y --y坐標
- 返回值 :無
- **************************************************/
- void Lcd_DrawLine_X(uchar x_start,uchar x_end,uchar y)
- {
- uchar temp;
- if(x_start > x_end)
- {
- temp = x_start;
- x_start = x_end;
- x_end = temp;
- }
- do
- {
- LCD_Set_Dot1(x_start,y);
- x_start++;
- }
- while(x_start <= x_end);
- }
- /**************************************************
- 函數名稱:Lcd_DrawLine_Y
- 功 能:畫豎線
- 參 數:y_start--起始地址y坐標
- y_end --結束地址y坐標
- x --x坐標
- 返回值 :無
- **************************************************/
- void Lcd_DrawLine_Y(uchar y_start,uchar y_end,uchar x)
- {
- uchar temp;
- if(y_start > y_end)
- {
- temp = y_start;
- y_start = y_end;
- y_end = temp;
- }
- do
- {
- LCD_Set_Dot1(x,y_start);
- y_start++;
- }
- while(y_start <= y_end);
- }
- /**************************************************
- 函數名稱:Lcd_ReDrawLine_Y
- 功 能:取消畫的豎線
- 參 數:y_start--起始地址y坐標
- y_end --結束地址y坐標
- x --x坐標
- 返回值 :無
- **************************************************/
- void Lcd_ReDrawLine_Y(uchar y_start,uchar y_end,uchar x)
- {
- uchar temp;
- if(y_start > y_end)
- {
- temp = y_start;
- y_start = y_end;
- y_end = temp;
- }
- do
- {
- LCD_ReSet_Dot1(x,y_start);
- y_start++;
- }
- while(y_start <= y_end);
- }
- /**************************************************
- 函數名稱:Lcd_DrawLine
- 功 能:畫任意直線
- 參 數:x_start--起始地址x坐標
- x_end --結束地址x坐標
- y_start--起始地址y坐標
- y_end --結束地址y坐標
- 返回值 :無
- **************************************************/
- void DrawLine(uchar x_start,uchar y_start,uchar x_end,uchar y_end)
- {
- int range_x,range_y;
- int flagx,flagy;
- uchar distance,t;
- uchar xt,yt;
- range_x = x_end - x_start;
- range_y = y_end - y_start;
-
- if(range_x > 0) flagx = 1;
- else
- if(range_x == 0)
- {
- Lcd_DrawLine_Y(y_start,y_end,x_start);
- return;
- }
- else
- {
- flagx = -1;
- }
- /************Y軸****************/
- if(range_y > 0) flagy = 1;
- else
- if(range_y == 0)
- {
- Lcd_DrawLine_X(x_start,x_end,y_start);
- return;
- }
- else
- {
- flagy = -1;
- }
-
- range_x = abs(range_x);
- range_y = abs(range_y);
- if(range_x > range_y) distance = range_x;
- else
- distance = range_y;
-
-
- /************Bresenham 畫線算法****************/
- for(t=0;t<distance+1;t++)
- {
- LCD_Set_Dot1(x_start,y_start);
- xt = xt + range_x;
- yt = yt + range_y;
- if(xt>distance)
- {
- xt = xt - distance;
- x_start = x_start + flagx;
- }
- if(yt > distance)
- {
- yt = yt - distance;
- y_start = y_start + flagy;
- }
- }
- }
- /*************************************************
- 函數名稱:Draw_TX
- 功 能:畫圓
- 參 數:Yaddr--Y地址
- Xaddr--Y地址
- dp --指向圖形數據存放地址的指針
- 返回值 :無
- **************************************************/
- void Lcd_DrawCircle(uchar x,uchar y,uchar r)
- {
- uchar a,b;
- float c;
- a = 0;
- b = r;
- // c = 1.25 - r;
- c = 3 - 2*r;
- while(a < b)
- {
- LCD_Set_Dot1(x+a,y+b);
- LCD_Set_Dot1(x-a,y+b);
- LCD_Set_Dot1(x+a,y-b);
- LCD_Set_Dot1(x-a,y-b);
-
- LCD_Set_Dot1(x+b,y+a);
- LCD_Set_Dot1(x-b,y+a);
- LCD_Set_Dot1(x+b,y-a);
- LCD_Set_Dot1(x-b,y-a);
-
- if(c < 0)
- {
- c = c+4*a + 6;
- }
- else
- {
- c= c + 4*(a - b) + 10;
- b-=1;
- }
- a = a + 1;
- }
- if(a == b)
- {
- LCD_Set_Dot1(x+a,y+b);
- LCD_Set_Dot1(x-a,y+b);
- LCD_Set_Dot1(x+a,y-b);
- LCD_Set_Dot1(x-a,y+b);
-
- LCD_Set_Dot1(x+b,y+a);
- LCD_Set_Dot1(x-b,y+a);
- LCD_Set_Dot1(x+b,y-a);
- LCD_Set_Dot1(x-b,y-a);
- }
- }
- /**************************************************
- 函數名稱:Disp_HZ
- 功 能:顯示漢字
- 參 數:addr--指定行
- *pt--指向數據的指針
- num--漢字的個數
- 返回值 :無
- **************************************************/
- void DisplayCgrom(uchar addr,uchar *hz)
- {
- Write_Cmd(addr);
- Delay_Nms(2);
- while(*hz != '\0')
- {
- Write_Data(*hz);
- hz++;
- Delay_Nms(2);
- }
- }
- /*******************************************
- 函數名稱:Draw_PM
- 功 能:在整個液晶屏幕上畫圖
- 參 數:無
- 返回值 :無
- ********************************************/
- void Draw_PM(const uchar *ptr)
- {
- uchar i,j,k;
-
- Write_Cmd(0x34); //打開擴展指令集
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- Write_Cmd(i++);
- Write_Cmd(0x80);
- for(k = 0;k < 16;k++)
- {
- Write_Data(*ptr++);
- }
- }
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- Write_Cmd(i++);
- Write_Cmd(0x88);
- for(k = 0;k < 16;k++)
- {
- Write_Data(*ptr++);
- }
- }
- Write_Cmd(0x36); //打開繪圖顯示
- Write_Cmd(0x30); //回到基本指令集
- }
- /**************************************************
- 函數名稱:Draw_TX
- 功 能:顯示一個16X16的圖形
- 參 數:Yaddr--Y地址
- Xaddr--Y地址
- dp --指向圖形數據存放地址的指針
- 返回值 :無
- **************************************************/
- void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar *dp)
- {
- uchar j;
- uchar k=0;
- Write_Cmd(0x34);
- for(j=0;j<16;j++)
- {
- Write_Cmd(Yaddr++);
- Write_Cmd(Xaddr);
- Write_Data(dp[k++]);
- Write_Data(dp[k++]);
- }
- Write_Cmd(0x36);
- }
- /**************************************************
- 函數名稱:Draw_Font
- 功 能:顯示一個3X8的圖形
- 參 數:Yaddr--Y地址
- Xaddr--Y地址
- dp --指向圖形數據存放地址的指針
- 返回值 :無
- **************************************************/
- void Draw_Font(uchar Yaddr,uchar Xaddr,uchar *dp)
- {
- uchar j,i;
- // uchar k=0;
- // Write_Cmd(0x34);
- for(i=0;i<3;i++)
- {
- for(j=0;j<8;j++)
- {
- if( (0x80>>j) & (*dp) )
- LCD_Set_Dot1(Xaddr+i,Yaddr+j);
- else
- LCD_ReSet_Dot1(Xaddr+i,Yaddr+j);
- }
- dp++;
- }
- /* for(j=0;j<16;j++)
- {
- Write_Cmd(Yaddr++);
- Write_Cmd(Xaddr);
- Write_Data(dp[k++]);
- Write_Data(dp[k++]);
- }*/
- // Write_Cmd(0x36);
- }
- /**************************************************
- 函數名稱:ADC_Init()
- 功 能:初始化ADC12
- 參 數:無
- 返回值 :無
- **************************************************/
- void ADC_Init(void)
- {
- P6SEL |=0X01;
- ADC12CTL0 |=ADC12ON + SHT0_1 + MSC;
- ADC12CTL1 |=SHP + CONSEQ_2;
- ADC12MCTL0 |=INCH_0;
- ADC12IE |=0X0F;
- ADC12CTL0 |=ENC+ADC12SC;//使能轉換;開始轉換
-
- _EINT();
- }
- /**************************************************
- 函數名稱:ADC12ISR
- 功 能:ADC中斷服務函數
- 參 數:無
- 返回值 :無
- **************************************************/
- #pragma vector = ADC12_VECTOR
- __interrupt void ADC12ISR (void)
- {
- results[index] = ADC12MEM0; // Move results
- index++;
- if(index == 100)
- ADC12IE = 0X00;
- }
- /*******************測量電壓峰峰值********************/
- void Disp_Vpp(unsigned char hang,unsigned char lie,unsigned int VPP)
- {
- float real_vpp;
- unsigned int Uintvpp;
- unsigned char ge,shi,bai; //,i;
- real_vpp = (VPP*3.3)/1024;
- Uintvpp = (int)real_vpp*100;
- bai = Uintvpp/100%10;
- shi = Uintvpp/10%10;
- ge = Uintvpp%10;
-
- Draw_Font(hang,lie+0,font3x6+9+bai*3);
- Draw_Font(hang,lie+3,font3x6+3);
- Draw_Font(hang,lie+6,font3x6+9+shi*3);
- Draw_Font(hang,lie+10,font3x6+9+ge*3);
-
- }
- void Measure_Vol(void)
- {
- unsigned int Max_voltage = 0,Min_voltage = 1024;
- unsigned int c;
- // float Real_Voltage;
- uchar i,e=0;
-
- for(i=0;i<100;i++)
- {
- if(results[i] > Max_voltage)
- Max_voltage = results[i];
- else
- if(results[i] < Min_voltage)
- Min_voltage = results[i];
- }
-
- c = Max_voltage - Min_voltage;
- e++;
- if(e > 5)
- {
- Disp_Vpp(10,102,Max_voltage);
- Disp_Vpp(17,102,Min_voltage);
- Disp_Vpp(24,102,c);
- e = 0;
- }
- }
- void Clock_Init()
- {
- uchar i;
- BCSCTL1&=~XT2OFF; //打開XT振蕩器
- BCSCTL2|=SELM1+SELS; //MCLK為8MHZ,SMCLK為8MHZ
- do{
- IFG1&=~OFIFG; //清除震蕩標志
- for(i=0;i<100;i++)
- _NOP(); //延時等待
- }
- while((IFG1&OFIFG)!=0); //如果標志為1,則繼續循環等待
- IFG1&=~OFIFG;
- }
- main()
- {
- uchar y1=0,y2=0,i=0,j; //y坐標
- uchar TimeDiv = 3;
- WDTCTL = WDTPW + WDTHOLD;
- P1DIR = 0X00; //P1.7--P1.0設為輸入,檢測按鍵
- Clock_Init();
- Ini_lcd();
- Clear_GDRAM();
- Draw_PM(tab);
- ADC_Init();
- _EINT();
- DisplayCgrom(0x80,"電子歡迎你");
- DisplayCgrom(0x88,"xxxxxx");
- DisplayCgrom(0x90,"xxxxxx ");
- DisplayCgrom(0x98,"xxxxxxxx");
- while(1)
- {
-
- if(!(P1IN&(0x01<<S3)))
- {
- while(!(P1IN&(0x01<<S3)));
- Write_Cmd(0x01);
- }
- /**********************檢測按鍵**************************/
- if(!(P1IN&(0x01<<S2)))
- {
- while(!(P1IN&(0x01<<S2)));
- TimeDiv--;
- ADC12CTL0 &=~ ENC;
- ADC12CTL0 = SHT0_1;
- ADC12MCTL0 |=INCH_0;//通道選擇
- ADC12CTL1 = CONSEQ_2; //Repeat single channel
- ADC12CTL0 = TimeDiv*0x800 + MSC + ADC12ON ; //ADC10ON , Interrupt enale
- ADC12IE |=0X01;
- ADC12CTL0 |= ENC + ADC12SC; // Sampling and conversion start
- if(TimeDiv == 0) TimeDiv = 4;
- }
-
- if(index == 100) //測完99次再顯示
- {
- index = 0;
- for(i=0;i<=99;i++) //顯示時把99次測量的值畫點在12864上
- {
- y1 = y2;
- y2 = 61 - (results[i]/17); //17表示 滿量程1024除以60個點
- LCD_Set_Dot1(i,y2);
-
- if((abs(y2 - y1)>=3)&&(i!=0)) //如果下一點的縱坐標比前一個點的縱坐標大3,為了看起來連續,兩個點畫線
- Lcd_DrawLine_Y(y1,y2,i);
- }
- Measure_Vol(); //測量最大值最小值
- Delay_Nms(200); //等待1秒左右時間
- /**********************檢測按鍵S1**************************/
- while(!(P1IN&(0x01<<S1))); // FREEZE,鎖定屏幕
- /**********************檢測按鍵S1**************************/
-
- for(i=0;i<=99;i++) //顯示過后刪除,不能清屏,因為清屏的話看起來屏幕會閃爍
- {
- y1 = y2;
- y2 = 61 - (results[i]/17);
- if((! ((i%10 == 9)&&(y2%10 == 1) ||(i==0) )))
- LCD_ReSet_Dot1(i,y2);
-
- if((abs(y2 - y1)>=3)&&(i!=0))
- Lcd_ReDrawLine_Y(y1,y2,i);
-
- }
-
- for(j=1;j<100;j=j+2) //畫中心X,Y軸
- {
- LCD_Set_Dot1(49,j);
- LCD_Set_Dot1(j,31);
- for(i=1;i<62;i=i+10)
- {
- if( ( ((j%10 == 9)||j==1))&&(i%10 == 1) ) //保存背景的點
- LCD_Set_Dot1(j,i);
- }
- }
- ADC12IE |=0X01;
- }
-
- }
- }
復制代碼
|