0.png (32.71 KB, 下載次數: 112)
下載附件
2016-4-13 21:32 上傳
12864的stm32單片機顯示程序下載:
顯示.rar
(3.14 MB, 下載次數: 154)
2016-4-13 21:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
主要的程序預覽:
- #include "stm32f10x.h"
- #include "delay.h" //必須配合delay.c和delay.h文件使用,所以要包含delay.h。
- #include "display12864.h"
- #define u16 unsigned short //為了可移植性好,對這兩個 STM 32 已經定義過的變量,再定義一次。
- #define u8 unsigned char
- /********** 以下是相關引腳定義。**************/
- #define DisIO GPIOC //定義12864要使用的I/O端口。
- #define DisClk RCC_APB2Periph_GPIOC //定義12864要使用的I/O端口的時鐘。
- #define Data GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
- //定義12864使用的數據引腳。
- #define RS GPIO_Pin_9
- #define RW GPIO_Pin_10
- #define EN GPIO_Pin_11 //定義使能端使用的引腳。
- #define PSB GPIO_Pin_12 //定義并,串行數據模式的選擇端口使用的引腳。
- /*********************************************/
-
- GPIO_InitTypeDef GPIOStru; //定義用于定義所以引腳為輸出的變量。
- void IOInitOut(void) //把所有端口初始化為推挽輸出模式的函數。
- {
- GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;//定義所有的引腳為推挽輸出的變量初始化。
- GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
- GPIOStru.GPIO_Pin = Data|RS|RW|EN|PSB;
- RCC_APB2PeriphClockCmd(DisClk,ENABLE);
- GPIO_Init(DisIO,&GPIOStru);
- }
- void IOInitIn(void) //把數據引腳初始化為浮空輸入的函數。
- {
- GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;//定義數據引腳為浮空輸入的變量初始化。
- GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
- GPIOStru.GPIO_Pin = Data;
- RCC_APB2PeriphClockCmd(DisClk,ENABLE); //把所有端口初始化為輸出模式的函數。
- GPIO_Init(DisIO,&GPIOStru);
- }
- void WaitBusy(void) //等待12864的忙狀態結束的函數。
- {
- IOInitIn(); //把數據引腳定義為浮空輸入;
- GPIO_ResetBits(DisIO,RS); //RS = 0.
- GPIO_SetBits(DisIO,RW); //RW = 1.
- GPIO_SetBits(DisIO,EN); //EN = 1.
- while(GPIO_ReadInputData(DisIO) & 0x0080); //只要位7的值,位7是忙標志位。
- GPIO_ResetBits(DisIO,EN); //EN = 0;
- IOInitOut(); //把所有引腳定義為輸出。
- }
- void WriteCmd(u8 cmd) //寫命令函數。
- {
- WaitBusy();
- GPIO_ResetBits(DisIO,RS); //RS = 0.
- GPIO_ResetBits(DisIO,RW); //RW = 0.
- GPIO_SetBits(DisIO,EN); //EN = 1.
- DisIO->ODR=((DisIO->ODR & 0xff00)|cmd); //此處,只有直接操作寄存器才能
- //達到,只改變輸出數據寄存器ODR的低8位,其它位
- //不變的目的。因為,只有低8位是數據引腳,
- //其它位可能是控制引腳,不能改變。
- delay_ms(2);
- GPIO_ResetBits(DisIO,EN); //EN = 0;
- delay_ms(2);
- }
- void WriteData(u8 data) //寫數據函數。
- {
- WaitBusy();
- GPIO_SetBits(DisIO,RS); //RS = 1.
- GPIO_ResetBits(DisIO,RW); //RW = 0.
- GPIO_SetBits(DisIO,EN); //EN = 1.
- DisIO->ODR=((DisIO->ODR & 0xff00)|data); //同上。
- delay_ms(2);
- GPIO_ResetBits(DisIO,EN); //EN = 0;
- delay_ms(2);
- }
- void InitDis(void) //初始化 12864 和要用到的 STM 32 的引腳。
- {
- IOInitOut();
- delay_init(8); //初始化延時函數的微妙計數基數。
- GPIO_SetBits(DisIO,PSB); //令PSB=1,設置為并行數據模式。
- delay_ms(2);
- WriteCmd(0x30); //選擇基本指令集,和,8位數據模式。
- delay_ms(2);
- WriteCmd(0x0c); //開顯示,無游標,不反白.
- delay_ms(2);
- WriteCmd(0x01); //清除顯示,并將 DDRAM 的地址計數器 AC 設為 00H.
- delay_ms(2);
- WriteCmd(0x06); //設置,外部讀寫數據后,地址記數器 AC 會自動加 1。
- delay_ms(2);
- WriteCmd(0x80); //將 DDRAM 地址計數器 AC 設為 0.
- delay_ms(2);
- }
- void DisStr(u8 *s) //顯示字符串的函數。
- {
- while(*s != '')
- {
- WriteData(*s);
- s++;
- delay_ms(2);
- }
- }
- void DisInt(long int num) //顯示整型變量的函數,最多顯示16位的整數。只能顯示正數。
- {
- u8 temp[17];
- u8 str[17];
- int i=0,j=0;
- while(num != 0) //這里不能用num%10 != 0,如果num是10的整數倍,
- //例如,100,這樣就會出錯,根本就不能進入循環體。
- {
- temp[i] = (num%10)+0x30;
- num/=10;
- i++;
- }
- i--; //因為i在退出循環之前還自加了一次,此時,
- //指向最后一個存儲有用值的元素的后一個位置。
- while(i != -1) //因為i=0時,temp[0]還是有用值。
- {
- str[j] = temp[i];
- j++;
- i--;
- }
- str[j]=''; //因為i在退出循環之前還自加了一次,此時,
- //指向最后一個存儲有用值的元素的后一個位置。
- DisStr(str);
- }
- void DisFloat(float fnum) //顯示有4位小數的浮點數,總位數不超過16位。
- {
- long int num = fnum*10000;
- u8 temp[17];
- u8 str[17];
- int i=0,j=0;
- while(num != 0)
- {
- temp[i] = (num%10)+0x30;
- num/=10;
- i++;
- if(i == 4) //4位小數處理完后,加入小數點。
- {
- temp[i] = '.';
- i++;
- }
- }
- i--;
- while(i != -1)
- {
- str[j] = temp[i];
- j++;
- i--;
- }
- str[j]='';
- DisStr(str);
- }
- /*以下是光標定位函數,第一個參數為行坐標,第二個為列坐標,起始坐標是1行1列。
- 只能以16個點的寬度為單位移動。*/
- void locate16(int row, int col)
- {
- switch(row)
- {
- case 1: WriteCmd(0x80+col-1); break;
- case 2: WriteCmd(0x90+col-1); break;
- case 3: WriteCmd(0x88+col-1); break;
- case 4: WriteCmd(0x98+col-1); break;
- }
- }
- /*光標定位函數定義結束。*/
復制代碼
建議把fwlib組里的.c文件生成一個.lib庫吧,因為一般是不需要改這部分的代碼的,
當需要重新編譯的時候,全部庫文件都編譯的話會把速度拖慢的。。。
先把其它組的 include in target build 屬性去掉
bae746a1b2bc08745cfd755fe76282c0_941.gif (9.06 KB, 下載次數: 126)
下載附件
2016-4-13 21:57 上傳
這個是默認的選擇,點到沒勾了就表示去掉了
3b0c853d823941c2a3a6269bd144c096_687.gif (10.96 KB, 下載次數: 104)
下載附件
2016-4-13 21:57 上傳
然后設置項目的output屬性生成lib文件
c5a0b092e7c9430ca2177a8be4cf8b09_858.gif (54.15 KB, 下載次數: 141)
下載附件
2016-4-13 21:57 上傳
|