花了半天時間調試完成了一個變量顯示函數,可以任意指定顯示數字的位數(通常不超過10位),還可以設定是否顯示前導‘0’,并可在任意位置插入小數點(當然這個小數點是人為確定的,不是數據中計算出來的,因為數據是無符號類型)。這個函數很容易移植到其他應用中的,只要修改一下相關顯示的代碼就行。
STM32單片機源程序:
- /****************************************************************
- * 顯示變量函數display_value()
- * 輸入參數:開始顯示(左上角)坐標:x,y,(uint16_t)
- * 前景色,背景色,(White,Black,Red,Green,Blue,Yellow)
- * 變量,(uint32_t)
- * 顯示長度(不含小數點),小數位數,(uint8_t)
- * 前導0(0=顯示,1=空格)
- *****************************************************************/
- void display_value(uint16_t x,uint16_t y,uint16_t fc,uint16_t bc,uint32_t v,uint8_t l,uint8_t b,uint8_t z)
- {
- unsigned char i,j,m;
- unsigned short k,x0;
- uint32_t u,n;
-
- x0 = x;
- u = v;
- z = z > 0 ? 0: 16; //前導0:z=16;前空格:z=0
- n = 1;
- for(j = 1; j < l; j++) //計算倍數
- n = n * 10;
-
- LCD_CS_CLR; //選擇LCD
- for(m = l;m > 0;m --) //開始分拆變量
- {
- k = u / n; //當前位數字
- u = u - (k * n); //剩余數字
- if(k > 0) z = 16; //只要有一位數字>0,之后不能顯示空格
- if(m == 1) z = 16; //小數點之前的'0'顯示
- n = m < 2 ? 1: n / 10; //計算當前的倍數
-
- if((m == b) & (m > 0)) //顯示小數點
- {
- for(i = 0;i < 16;i ++){
- for(j = 0;j < 8;j ++){
- if(asc16[14 * 16 + i] & (0x80 >> j))//從asc16[]數組中取字符.數據
- /* draw a point on the lcd */
- lcd_draw_point(x + j,y + i,fc);
- else{
- if(fc != bc)
- /* draw a point on the lcd */
- lcd_draw_point(x + j,y + i,bc);
- }
- }
- }
- x += 8;
- }
-
- for(i = 0;i < 16;i ++){ //顯示字符(k=字符序號)
- for(j = 0;j < 8;j ++){
- if(asc16[(k+z) * 16 + i] & (0x80 >> j))//從asc16[]數組中取字符數據
- /* draw a point on the lcd */
- lcd_draw_point(x + j,y + i,fc);
- else{
- if(fc != bc)
- /* draw a point on the lcd */
- lcd_draw_point(x + j,y + i,bc);
- }
- }
- }
- x += 8;
- }
- LCD_CS_SET;
- }
復制代碼
|